﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using rosata.Models;

namespace rosata.Providers.PromozioniProvider
{
    public class PromozioniProvider : IPromozioniProvider
    {
        private rosataEntities _rosataEntities;

        private readonly string _pathPromozioni = HttpContext.Current.Server.MapPath("~/Public/Promozioni/");

        public List<PromozioneDto> ListaPromozioni()
        {
            List<PromozioneDto> listaPromozioneDto = new List<PromozioneDto>();

            using (_rosataEntities = new rosataEntities())
            {

                var promozioniDb = _rosataEntities.Promozioni.ToList();

                foreach (var promozioneDb in promozioniDb)
                {
                    PromozioneDto promozione = new PromozioneDto();

                    promozione.DataFine = promozioneDb.DataFine;
                    promozione.DataInizio = promozioneDb.DataInizio;
                    promozione.NomeDocumento = promozioneDb.Documento;
                    promozione.Id = promozioneDb.Id;
                    promozione.NomeImmagineHeaderSito = promozioneDb.ImmagineHeaderSito;
                    promozione.NomeImmaginePiccola = promozioneDb.ImmaginePiccola;
                    promozione.TestoDescrittivo = promozioneDb.TestoDescrittivo;
                    promozione.TitoloPromozione = promozioneDb.TitoloPromozione;

                    listaPromozioneDto.Add(promozione);
                }
            }

            return listaPromozioneDto;
        }

        public void AddPromozione(PromozioneDto promozioneDto)
        {
            using (_rosataEntities = new rosataEntities())
            {
                if (promozioneDto.ImmagineHeaderSito != null &&  promozioneDto.ImmagineHeaderSito.ContentLength > 4096000)
                    throw new Exception("Immagine Header maggiore di 4 Mega Byte");

                if (promozioneDto.ImmaginePiccola != null && promozioneDto.ImmaginePiccola.ContentLength > 4096000)
                    throw new Exception("Immagine piccola maggiore di 4 Mega Byte");

                if (promozioneDto.Documento != null && promozioneDto.Documento.ContentLength > 4096000)
                    throw new Exception("documento maggiore di 4 Mega Byte");

                Models.Promozioni promozioneDb = new Models.Promozioni();

                promozioneDb.DataFine = promozioneDto.DataFine;
                promozioneDb.DataInizio = promozioneDto.DataInizio;
                
                if(promozioneDto.Documento != null)
                    promozioneDb.Documento = promozioneDto.Documento.FileName;
                
                if(promozioneDto.ImmagineHeaderSito != null)
                    promozioneDb.ImmagineHeaderSito = promozioneDto.ImmagineHeaderSito.FileName;
                
                promozioneDb.ImmaginePiccola = promozioneDto.ImmaginePiccola.FileName;
                promozioneDb.TestoDescrittivo = promozioneDto.TestoDescrittivo;
                promozioneDb.TitoloPromozione = promozioneDto.TitoloPromozione;

                _rosataEntities.Promozioni.AddObject(promozioneDb);

                _rosataEntities.SaveChanges();

                string path = Path.Combine(_pathPromozioni + promozioneDb.Id + "/");

                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);

                if (promozioneDto.ImmagineHeaderSito != null)
                    promozioneDto.ImmagineHeaderSito.SaveAs(path + promozioneDto.ImmagineHeaderSito.FileName);

                if (promozioneDto.ImmaginePiccola != null)
                    promozioneDto.ImmaginePiccola.SaveAs(path + promozioneDto.ImmaginePiccola.FileName);

                if (promozioneDto.Documento != null)
                    promozioneDto.Documento.SaveAs(path + promozioneDto.Documento.FileName);
            }
        }

        public void UpdatePromozione(PromozioneDto promozioneDto)
        {
            using (_rosataEntities = new rosataEntities())
            {
                Promozioni promozioneDb = _rosataEntities.Promozioni.FirstOrDefault(p => p.Id == promozioneDto.Id);

                if (promozioneDb == null)
                    throw new Exception("la promozione che si vuole aggiornare (" + promozioneDto.Id + ") non esiste");

                //campi che ci devono essere obbilgatoriamente e che quindi sovrascrivo:
                promozioneDb.TitoloPromozione = promozioneDto.TitoloPromozione;
                promozioneDb.TestoDescrittivo = promozioneDto.TestoDescrittivo;
                promozioneDb.DataInizio = promozioneDto.DataInizio;
                promozioneDb.DataFine = promozioneDto.DataFine;

                _rosataEntities.SaveChanges();

                string path = Path.Combine(_pathPromozioni + promozioneDb.Id + "/");

                //dati facoltativi
                if (promozioneDto.ImmagineHeaderSito != null)
                    promozioneDto.ImmagineHeaderSito.SaveAs(path + promozioneDto.ImmagineHeaderSito.FileName);

                if (promozioneDto.ImmaginePiccola != null)
                    promozioneDto.ImmaginePiccola.SaveAs(path + promozioneDto.ImmaginePiccola.FileName);

                if (promozioneDto.Documento != null)
                    promozioneDto.Documento.SaveAs(path + promozioneDto.Documento.FileName);
            }
        }

        public List<PromozioneDto> GetListaPromozioniAttive()
        {
            List<PromozioneDto> listaPromozioni = new List<PromozioneDto>();

            using (_rosataEntities = new rosataEntities())
            {
                var promozioniDb = _rosataEntities.Promozioni.Where(p => p.DataFine >= DateTime.Now);

                foreach (var promozioneDb in promozioniDb)
                {
                    PromozioneDto promozioneDto = new PromozioneDto();

                    promozioneDto.Id = promozioneDb.Id;
                    promozioneDto.DataFine = promozioneDb.DataFine;
                    promozioneDto.DataInizio = promozioneDb.DataInizio;
                    promozioneDto.NomeDocumento = promozioneDb.Documento;
                    promozioneDto.NomeImmagineHeaderSito = promozioneDb.ImmagineHeaderSito;
                    promozioneDto.NomeImmaginePiccola = promozioneDb.ImmaginePiccola;
                    promozioneDto.TestoDescrittivo = promozioneDb.TestoDescrittivo;
                    promozioneDto.TitoloPromozione = promozioneDb.TestoDescrittivo;

                    listaPromozioni.Add(promozioneDto);
                }
            }

            return listaPromozioni;
        }

        public void UpdateImmaginePiccolaPromozione(int idPromozione, HttpPostedFileBase immaginePiccola)
        {
            using (_rosataEntities = new rosataEntities())
            {
                if (File.Exists(_pathPromozioni + idPromozione + "/" + immaginePiccola.FileName))
                    throw new Exception("esiste gia un file con nome " + immaginePiccola.FileName + " per la promozione " + idPromozione);

                immaginePiccola.SaveAs(_pathPromozioni + idPromozione + "/" + immaginePiccola.FileName);

                var promozioneDb = _rosataEntities.Promozioni.First(p => p.Id == idPromozione);

                promozioneDb.ImmaginePiccola = immaginePiccola.FileName;

                _rosataEntities.SaveChanges();
            }
        }

        public void UpdateImmagineHeaderPromozione(int idPromozione, HttpPostedFileBase immagineHeader)
        {
            using (_rosataEntities = new rosataEntities())
            {
                if (File.Exists(_pathPromozioni + idPromozione + "/" + immagineHeader.FileName))
                    throw new Exception("esiste gia un file con nome " + immagineHeader.FileName + " per la promozione " + idPromozione);

                immagineHeader.SaveAs(_pathPromozioni + idPromozione + "/" + immagineHeader.FileName);

                var promozioneDb = _rosataEntities.Promozioni.First(p => p.Id == idPromozione);

                promozioneDb.ImmagineHeaderSito = immagineHeader.FileName;

                _rosataEntities.SaveChanges();
            }
        }

        public void UpdateDocumentoPromozione(int idPromozione, HttpPostedFileBase documento)
        {
            using (_rosataEntities = new rosataEntities())
            {
                if (File.Exists(_pathPromozioni + idPromozione + "/" + documento.FileName))
                    throw new Exception("esiste gia un file con nome " + documento.FileName + " per la promozione " + idPromozione);

                documento.SaveAs(_pathPromozioni + idPromozione + "/" + documento.FileName);

                var promozioneDb = _rosataEntities.Promozioni.First(p => p.Id == idPromozione);

                promozioneDb.Documento = documento.FileName;

                _rosataEntities.SaveChanges();
            }
        }

        public void DeletePromozione(int idPromozione)
        {
            using (_rosataEntities = new rosataEntities())
            {
                Promozioni promozioneDb = _rosataEntities.Promozioni.First(p => p.Id == idPromozione);

                _rosataEntities.Promozioni.DeleteObject(promozioneDb);

                _rosataEntities.SaveChanges();

                Directory.Delete(_pathPromozioni + idPromozione, true);
            }
        }

        public PromozioneDto GetPromozioneById(int idPromozione)
        {
            PromozioneDto promozioneDto = new PromozioneDto();

            using (_rosataEntities = new rosataEntities())
            {
                var promozioneDb = _rosataEntities.Promozioni.First(p => p.Id == idPromozione);

                promozioneDto.DataInizio = promozioneDb.DataInizio;
                promozioneDto.DataFine = promozioneDb.DataFine;
                promozioneDto.NomeDocumento = promozioneDb.Documento;
                promozioneDto.NomeImmagineHeaderSito = promozioneDb.ImmagineHeaderSito;
                promozioneDto.NomeImmaginePiccola = promozioneDb.ImmaginePiccola;
                promozioneDto.NomeDocumento = promozioneDb.Documento;
                promozioneDto.TestoDescrittivo = promozioneDb.TestoDescrittivo;
                promozioneDto.TitoloPromozione = promozioneDb.TitoloPromozione;
                promozioneDto.Id = promozioneDb.Id;
            }

            return promozioneDto;
        }
    }
}
